from flask import Flask
from flask_bcrypt import Bcrypt
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy
from gensim.models.word2vec import Word2Vec
import os
import logging


# Flask-SQLAlchemy扩展 无需编写 SQL 语句，直接通过 Python 类和对象操作数据库
db = SQLAlchemy()
# Flask-Bcrypt 扩展，用于安全地存储和验证用户密码
bcrypt = Bcrypt()
# Word2Vec模型
model = None


def create_app():
    # 创建 Flask 应用
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_mapping(
        SECRET_KEY='dev', #用于会话加密的密钥
        DATABASE=os.path.join(app.instance_path, 'app.sqlite'),
        SQLALCHEMY_DATABASE_URI=f'sqlite:///{os.path.join(app.instance_path, "app.sqlite")}', # SQLAlchemy 连接数据库的 URI，格式为 sqlite:///文件路径
        SQLALCHEMY_TRACK_MODIFICATIONS=False # 禁用 Flask-SQLAlchemy 的对象变更追踪系统，减少内存消耗
    )
    CORS(app) # 允许前端（如 React、Vue 应用）通过 AJAX 请求访问 Flask API


    # 初始化日志设置
    logging.basicConfig(level=logging.INFO)
    logger = logging.getLogger(__name__)

    # 设置gensim的日志级别为warning 不会干扰别的日志
    logger_gensim = logging.getLogger('gensim').setLevel(logging.WARNING)

    # 创建一个过滤器，排除特定路径的日志
    class DevToolsFilter(logging.Filter):
        def filter(self, record):
            return '/.well-known/appspecific/com.chrome.devtools.json' not in record.getMessage()

    # 应用过滤器到Werkzeug的日志记录器
    logging.getLogger('werkzeug').addFilter(DevToolsFilter())


    # 加载 Word2Vec 模型   os.path.dirname(__file__) 当前文件的工作目录
    global model
    MODEL_PATH = os.path.join(os.path.dirname(__file__), 'model', 'm_wv_model2.model')
    try:
        model = Word2Vec.load(MODEL_PATH)
        logger.info("Word2Vec模型加载成功")
    except Exception as e:
        logger.error(f'模型加载失败：{e}')
        raise  # 把异常重新抛出给上层，让调用代码的函数或模块来处理

    # 初始化数据库和加密模块
    db.init_app(app)
    bcrypt.init_app(app)

    # 确保实例文件夹存在
    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass

    # 导入Flask-SQLAlchemy扩展 数据库用户模型
    from models import User

    # 在应用上下文环境中执行db.create_all() 自动创建所有定义好的数据库表
    # 虽然User没有被使用 但其中定义的模型仍然会被创建
    with app.app_context():
        db.create_all()

    # 导入auth蓝图 登录注册API路由
    from auth import bp as auth_bp
    app.register_blueprint(auth_bp)

    # 导入app API路由
    from routes import register_routes
    register_routes(app)

    return app